John Clayton Mayer é um cantor, compositor e produtor musical norte-americano. Nascido em Bridgeport, no estado de Connecticut, ele estudou na Berklee College of Music. Autor de músicas que ganharam o Grammy Awards como Your Body Is A Wonderland. Comecou tocando rock, mas foi transitando para o blues. Já colaborou com artistas renomados do blues como B.B. King e Eric Clapton.
In [1]:
# Importando a biblioteca Requests
import requests
url = "https://www.letras.mus.br/john-mayer/420168/"
r = requests.get(url)
type(r)
Out[1]:
Ao examinarmos a chamada da funcao requests.get() obtemos um objeto do tipo Response. Para mais informacoes e um pequeno Quickstart dessa biblioteca acesse
In [2]:
# Extrair o HTML do objeto Response e imprime
html = r.text
#print(html)
Muito bom, agora já temos todo o conteúdo da página que contem a música Gravity do John Mayer. O próximo passo é realizar o parsing ou a separacao do conteúdo da música, do restante da página. Para realizar essa tarefa vamos usar uma outra biblioteca chamada BeautifulSoup
In [3]:
# Importando a biblioteca BeautifulSoup de bs4
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, "html5lib")
type(soup)
Out[3]:
Agora chegou o momento de extra informacoes relevantes da página que acabamos de coletar, como o título da página
In [4]:
soup.title
Out[4]:
Como podemos perceber ele retorna todo o conteúdo do título, mas é possível obter apenas a string do título da página
In [5]:
soup.title.string
Out[5]:
Podemos também obter uma lista com todos os hyperlinks da página, que no HTML sao declarados com a tag < a >
In [6]:
# Encontre todos os hyperlinks da nossa sopa e exibindo apenas os 10 primeiros
soup.findAll('a')[:10]
Out[6]:
Muito bem, o que nós precisamos fazer agora é extrair o texto da música que é o nosso objetivo inicial, para isso o BeautifulSoup contém um método chamado .get_text()
In [7]:
# Extrair o texto da nossa sopa e imprimir
text = soup.get_text()
#print(text)
Como podemos perceber esse método retorna todo conteúdo da página inclusive códigos Javascript ou CSS. Nao é exatamente o que gostariamos de obter, o texto da música está contido nessa sopa, mas nossa colher parece grande demais para come-la ;). Analisando a página que contém o texto da música temos uma boa pista. A tag < article > parece conter todo o conteúdo da letra da música. Vamos usar entao o método .findAll() passando como parâmetro a string 'article'
In [8]:
article_tag = soup.find('article')
type(article_tag)
Out[8]:
In [9]:
for br_tag in article_tag.find_all('br'):
br_tag.extract()
text = article_tag.get_text(separator=u' ', strip=True)
print(text)
Por último, vamos comecar a preparar o nosso corpus para uma posterior análise de NLP. Uma das primeiras etapas nesse processo é a etapa de tokenizacao. Para realizar isso vamos importar o módulo RegexpTokenizer da biblioteca NLTK (Natural Language Toolkit). Para mais detalhes sobre a biblioteca acesse. Existe também um livro que você pode ler aqui - http://www.nltk.org/book/
In [10]:
# Importando RegexpTokenizer de nltk.tokenize
from nltk.tokenize import RegexpTokenizer
# Criando o objeto tokenizer
tokenizer = RegexpTokenizer('\w+')
# Criando os tokens a partir do texto da música Gravity
tokens = tokenizer.tokenize(text)
tokens[:8]
Out[10]:
In [11]:
# Inicializando uma lista vazia que vai conter as palavras minúsculas
words = []
# Loop through list tokens and make lower case
for word in tokens:
words.append(word.lower())
# Print several items from list as sanity check
words[:8]
Out[11]:
That's all folks !!